SlideShare a Scribd company logo
1 of 8
Download to read offline
VB .NET 2005 By Warawut Khangkhan
การตรวจสอบและจ#ดการก#บข&อผ(ดพลาดใน VB.NET 2005 Express Edition



   การตรวจสอบและจดการกบขอผดพลาดใน VB .NET 2005 Express Edition
        ในการพ#ฒนาโปรแกรมท9กโปรแกรมย;อ มม<ข&อผ(ด พลาดเก(ดข> ?น ท# ?งระหว;า งการพ# ฒนาโปรแกรมหรB อ หล# งพ#ฒ นา
โปรแกรมเสรCจส(?นไปแล&ว ย;อมม<ข&อผ(ดพลาดเก(ดข>?นได& เพราะฉะน#?นเราจFาเปGนท<Hจะต&องรI&ถ>งข&อผ(ดพลาดต;าง ๆ รวมไปถ>งการ
จ#ดการก#บข&อผ(ดพลาดท<เH ก(ดข>น
                             ?

ชนดของขอผดพลาดต-าง ๆ ท01อาจเกดข34น
         ข&อผ(ดพลาดในโปรแกรม (ไม;ว;าจะเข<ยนด&วยภาษาใด) สามารถแบ;งออกเปGน 3 ประเภทหล#ก ๆ ได&แก; Syntax Error,
Logic Error และ Runtime Error

Syntax Error
        เปGนความผ(ดพลาดท<เH ก(ดข>นจากการเข<ยนคFาส#Hงไม;ถIกต&องตามรIปแบบไวยากรณY (Syntax) ของโปรแกรม เช;น
                                 ?

                 Private Sub Test1( )
                     Dim CustomerName As String
                     CustomerNme = “Warawut”
                 End Sub

        จากต#วอย;างข&างต&น จะเก(ดความผ(ดพลาดท<เH ราประกาศต#วแปร CustomerName ไว& แต;เวลาเราใช&งานจร(ง ๆ กล#บพ(มพY
ชBอของต#วแปรเปGน CustomerNme ซ>Hงไม;ม<ตวอ#กษร a ใน Name
  H                                    #
        อ<กต#วอย;าง เช;น

                 Private Sub Test2( )
                     Dim Long As Integer
                     Long = 1000
                 End Sub

         เก(ดข&อผ(ดพลาดท<Hเราต#?งชBHอต#วแปรเปGน Long เนBHองจากต#วแปร Long ท<Hเราได&ต#?งชBHอไว&เปGนคFาส#Hงสงวน (Keyword) ท<Hม<
อยI;ในโปรแกรม VB .NET ซ>Hง VB .NET ไม;อน9ญาตให&ต?งชBHอต#วแปรซ?าก#บ Keyword ได&
                                                       #            F
         Syntax Error ถB อว; า เปG น ประเภทข& อผ( ด พลาดท< H ส ามารถตรวจสอบได&ง ; า ยท< Hส 9 ด ในบรรดาข& อผ( ด พลาดท# ? ง หมด
เนBHองจาก VB .NET IDE จะเตBอนให&ทราบอยI;เสมอในขณะท<Hเราพ(มพYโค&ด (Code) โปรแกรม รวมท#?งบอกต&นตอของปaญหาให&ด&วย
เสรCจสรรพ เพ<งเราเลBHอนเมาสYไปย#งจ9ดท<H IDE ข<ดเส&นใต&ไว&กCจะม<คFาอธ(บายถ>งต&นตอของปaญหา ซ>HงเมBHอแก&ไขโปรแกรมให&เร<ยบ
ร&อยตามคFาแนะนFาของ IDE กCจะสามารถคอมไพลYโปรแกรมได&ตามปกต( หรBอในช;วงท<เH ราส#HงคอมไพลYโปรแกรม ถ&าหากโปรแกรม<
Syntax Error กCจะม<การแจ&งข&อผ(ดพลาดและหมายเลขบรรท#ดท<Hเก(ดข>นผ(ดพลาดให&ทราบ
                                                                      ?




                                                            -1-
VB .NET 2005 By Warawut Khangkhan
การตรวจสอบและจ#ดการก#บข&อผ(ดพลาดใน VB.NET 2005 Express Edition


Logic Error (ลอจกของโปรแกรมผดพลาด)
          Logic Error หรBอเร<ยกอ<กอย;างหน>Hงว;า Semantic Error เก(ดจากการท<HโปรแกรมทFางานได&ไม;ตรงตามท<Hเราต&องการ เช;น
ถ& า เราเข< ย น Procedure การถอนเง( น จากบ# ญช< (Withdrawal) เพB H อ หาค; า ของ NewAmount อ# น เก( ด จากการห# ก ลบเง( นต& น
(OriginalAmount) ด&วยเง(นท<Hตองการถอน (WithdrawAmount) ด#งน<?
                              &

                 Private Function Withdrawal(ByVal OriginalAmount As Double _
                                            ByVal WithdrawAmount As Double) As Double
                     Dim NewAmount As Double
                     NewAmount = OriginalAmount + WithdrawAmount
                     Return (NewAmount)
                 End Sub

          จากต#วอย;างจะเหCนว;าไม;ม<ความผ(ดพลาดใด ๆ ในแง;กฎเกณฑYของภาษา แต;เมBHอร#นโปรแกรมจะพบว;าได&ผลล#พธYไม;ตรง
ก#บท<Hต&องการ เพราะแทนท<Hจะเข<ยนว;า NewAmount = OriginalAmount – WithdrawAmount เรากล#บเข<ยนผ(ดเปGน NewAmoun =
OriginalAmount + WithdrawAmount ทFาให&ผลล#พธYทออกมาผ(ดไปจากท<ควรเปGน
                                               <H             H
          Logic Erro ถBอเปGนความผ(ดพลาดท<Hตรวจพบได&ยากท<Hส9ด เนBHองจากไม;ม<เครBHองมBอใดตรวจสอบให&เราได&ก;อนเหมBอน
ก#บกรณ< Syntax Error เราจะพบข&อผ(ดพลาดประเภทน<?กCต;อเมBHอตรวจสอบผลล#พธYแล&วพบว;าไม;ตรงก#บส(Hงท<Hต&องการ ซ>Hงต&อง
อาศ#ยความละเอ<ยดรอบคอบในการตรวจสอบอย;างมาก

Runtime Error (ความผดพลาดขณะรนโปรแกรม)
        Runtime Error หรBอเร<ยกอ<กอย;างหน>Hงว;า Execution Error เปGนข&อผ(ดพลาดท<Hเก(ดข>?นขณะร#นโปรแกรม ซ>Hงจะตรวจสอบ
ไม;พบในขณะท<เH ข<ยนโปรแกรมเช;นเด<ยวก#บ Logic Error ต#วอย;างของ Runtime Error เช;น เราส#HงเปnดไฟลY แต;โปรแกรมไม;พบไฟลYท<H
ต&องการ, การหารต#วเลขใด ๆ ด&วยศIนยY, การอ&างถ>งอ(นเดCกซYของอารYเรยYเก(นกว;าจFานวนสมาช(กท<HอารYเรยYน#?นม<อยI; เปGนต&น ข&อ
ผ(ดพลาดเหล;าน<?ถ&าเราไม;ได&เข<ยนโปรแกรมปpองก#นไว&ก;อน เมBHอเก(ดข>?นแล&วอาจทFาให&โปรแกรมถ>งข#?นหย9ดทFางาน (Terminate)
กลางค#นได&ทนท< เช;น
           #

                 Private Sub OpenFile( )
                     Dim MyFileReader As System.IO.StreamReader
                     MyFileReader = System.IO.File.OpenText(“C:abc.txt”)     'ส78งเป<ดไฟลA c:abc.txt
                 End Sub

          ต#วอย;า งโปรแกรมข&างต&นเราเข<ย น Procedure OpenFile เพBHอเปnดเทCกซYไฟลYและอ;านข&อมIลจากไฟลYข> ?นมา ซ> Hงถ&า ไฟลY
c:abc.txt ท<Hเราต&องการเปnดน#?นไม;ม<อยI;จร(ง หรBอม<อยI;แต;ไฟลYเส<ย กCจะทFาให&เก(ด Runtime Error และอาจทFาให&โปรแกรมของเรา
หย9ดทFางานท#นท<




                                                           -2-
VB .NET 2005 By Warawut Khangkhan
การตรวจสอบและจ#ดการก#บข&อผ(ดพลาดใน VB.NET 2005 Express Edition


การจดการขอผดพลาดโดยใชคFาส1ง On Error...
         ใน VB เวอรYช#Hนก;อนม<คFาส#Hงท<Hใช&จ#ดการก#บ Runtime Error (ความผ(ดพลาดขณะร#นโปรแกรม เช;น เปnดไฟลYหรBอฐาน
ข&อมIลไม;ได&, เก(ดการหารด&วยศIนยY) เพBHอช;วยให&โปรแกรมท<Hเราเข<ยนข>?นมาม<ความน;าเชBHอถBอสIง ไม;หย9ดทFางาน โดยการใช&คFาส#Hง
On Error ซ>Hงหมายถ>ง ถ&าเก(ด Runtime Error ข>?นจะให&ทFาคFาส#Hงอะไรต;อไป คFาส#Hง On Error ย#งสามารถใช&งานภายใน VB .NET ได&
เช;นก#น แต;ถBอว;าเปGน Unstructured Error Handling คBอ การจ#ดการความผ(ดพลาดแบบไม;เปGนโครงสร&าง
         คFาส#Hง On Error ม<ว(ธ<การใช&งานอยI; 3 รIปแบบหล#ก ๆ ได&แก;
               ● On Error Goto <ชDอเลเบลหรDอหมายเลขบรรท7ด>
                                      8
               ● On Error Goto 0
               ● On Error Resume Next


On Error Goto <ชJ1อเลเบลหรJอหมายเลขบรรทด>
       คFาส#H ง On Error Goto จะใช& เพBH อ บอกก# บ VB ว;า เมB Hอ เก(ดข&อผ( ด พลาดให& ก ระโดดไปทFา งานท< Hต Fา แหน; ง เลเบลใด หรBอ
บรรท#ดท<Hเท;าไหร;ในโปรแกรมย;อย โดยม<ว(ธ<การใช&งาน ด#งน<?

         รMปแบบ:
                [ Sub | Function ] <ชDอโพรซQเยอรA> ( )
                                      8
                    On Error Goto <ชDอเลเบลหรDอหมายเลขบรรท7ด>
                                        8
                    'คFาส#Hง ...

                     Exit Sub

                  <ชอเลเบล>:
                     'คFาส#Hงจ#ดการก#บข&อผ(ดพลาดท<Hพบ
                  End [ Sub | Function ]

        เช;นจากต#วอย;างโพรซ<เยอรY OpenFile ท<Hใช&เปnดเทCกซYไฟลY เราสามารใช& On Error Goto เพBHอช;วยปpองก#นไม;ให&โปรแกรม
หย9ดทFางานกลางค#นเมBอไม;สามารถเปnดไฟลYได& ด#งน<?
                    H

                  Private Sub OpenFile( )
                      Dim MyFileReader As System.IO.StreamReader
                      On Error Goto HandleError 'ถSาเกUด Runtime Error ใหSไปทWางานทQ8 HandleError
                      MyFileReader = System.IO.File.OpenText(“C:abc.txt”)  'ส78งเป<ดไฟลA c:abc.txt
                      Exit Sub

               HandleError:
                   MessageBox.Show(Err.Description)
               End Sub
          หมายเหตP: Err เปGน object พ(เศษ ซ>HงจะถIกสร&างข>นมาโดยอ#ตโนม#ต(เมBHอเก(ดข&อผ(ดพลาด
                                                          ?


                                                             -3-
VB .NET 2005 By Warawut Khangkhan
การตรวจสอบและจ#ดการก#บข&อผ(ดพลาดใน VB.NET 2005 Express Edition


Object Err
         ต#วอย;างท<Hผ;านมาเราใช& Object Err เพBHอแสดงข&อความอธ(บายข&อผ(ดพลาดท<Hเก(ดข>?น Err เปGน Object ชน(ดพ(เศษท<HจะถIก
สร&างข>นมาดยอ#ตโนม#ตเ( มBHอเก(ดข&อผ(ดพลาดในโปรแกรม โดย Err จะเกCบหมายเลขและข&อความแสดงข&อผ(ดพลาดไว&ใน Properties
       ?
Number และ Description ตามลFาด#บ
         ในต#วอย;างข&างต&นเราใช& MessageBox.Show(Err.Description) เพBHอแสดงค;า Properties Description ของ Object Err ออก
มาบนหน&าจอ

         Err.Description จะเกCบข&อความอธ(บายข&อผ(ดพลาดเปGนภาษาอ#งกฤษ แต;เราสามารถแสดงข&อความตามท<Hต&องการ
(เช;นข&อความเปGนภาษาไทย) ได& ด&วยการตรวจสอบหมายเลขข& อผ(ด พลาดจาก Err.Number แล&วแสดงข&อ ความอธ(บ ายข&อ
ผ(ดพลาดเอง เช;น
                  Private Sub OpenFile( )
                      Dim MyFileReader As System.IO.StreamReader
                      On Error Goto HandleError      'ถSาเกUด runtime error ใหSไปทWางานทQ8 HandleError
                      MyFileReader = System.IO.File.OpenText(“c:abc.txt”)       'ส78งเป<ดไฟลA c:abc.txt

                     Exit Sub

                HandleError:
                   If Err.Number = 53 Then
                       Message.Show(“ไม^พบไฟลA “ & “c:abc.txt” & “ ทQ8ตองการ”)
                                                                        S
                   End If
                End Sub
        หรBอเราอาจใช& MessageBox.Show(Err.Number) เพBHอแสดงหมายเลขของข&อผ(ดพลาดกCได&เช;นเด<ยวก#น
        หมายเหตP: ถ&า Err.Number ม<ค;าเท;าก#บ 0 หมายความว;าไม;เก(ดข&อผ(ดพลาดใด ๆ

          Object Err ย#งม<เมธอด (Method) Clear ท<Hใช&เคล<ยรYข&อผ(ดพลาดท<Hเก(ดข>?น และเมธอด (Method) Raise ท<Hใช&สFาหร#บสร&าง
ข&อผ(ดพลาดข>?นมา (เพBHอใช&ทดสอบว;าสามารถจ#ดการก#บข&อผ(ดพลาดได&อย;างถIกต&องหรBอไม; ) โดยเราสามารถใช&เมธอด Err.Raise
เพBHอให& VB สร&างข&อผ(ดพลาดตามหมายเลขท<เH รากFาหนดได& รIปแบบ คBอ
          รMปแบบ:
                   Err.Raise(<หมายเลขขSอผUดพลาดทQ8ตSองการสรSาง>)
          เช;น เราอาจใช&ค Fาส#Hง Err.Raise(53) เพBHอทดสอบว;าถ&า เปnด ไฟลYท< Hต&องการไม;ได& โปรแกรมเราย#งสามารถจ#ด การก#บ
ข&อผ(ดพลาดน#?นได&หรBอไม;




                                                           -4-
VB .NET 2005 By Warawut Khangkhan
การตรวจสอบและจ#ดการก#บข&อผ(ดพลาดใน VB.NET 2005 Express Edition


On Error Goto 0
         คFาส# Hง On Error Goto 0 ใช& เพBH อ ให& ย กเล(ก การตรวจสอบ Runtime Error ท<Hต# ?ง ไว& หรBออ<กน# ยหน> H งกCค B อ ให& VB เปGนผI &
จ# ด การก# บข& อผ( ด พลาดเอง เช; นต# ว อย; า ง Procedure OpenFile ในตอนแรกถ& า พบ Runtime Error จะให& ไ ปทF า งานท< H เ ลเบล
HandleError แต;หล#งจากท<HทFาคFาส#Hง OpenText ไปเร<ยบร&อยแล&ว เราอาจต&องการให& VB ยกเล(กการตรวจสอบและให& VB จ#ดการ
ก#บข&อผ(ดพลาดเอง กCสามารถเข<ยนโปรแกรมได&ด#งน<?

                   Private Sub OpenFile( )
                       Dim MyFileReader As System.IO.StreamReader
                       On Error Goto HandleError      'ถSาเกUด Runtime Error ใหSไปทWางานทQ8 HandleError
                       MyFileReader = System.IO.File.OpenText(“c:abc.txt ”)      'ส78งเป<ดไฟลA c:abc.txt

                       On Error Goto 0          'ยกเลUกการไปทWาทQ8 HandleError เมDอเกUด Runtime Error โดยปล^อยใหS VB จ7ดการ
                                                                                  8

                       'คWาส78งต^อไป...
                       Exit Sub

                   HandleError:
                      MessageBox.Show(Err.Description)
                   End Sub

On Error Resume Next
        คFาส# Hง On Error Resume Next ใช&กF า หนดให&โ ปรแกรมทFาคF าส#H งต;อ ไปถ> ง แม&ว ;า จะเก(ดข&อผ( ด พลาดข> ?นกC ต าม เช; น จาก
ต#วอย;างท<แล&ว ถ&าเราต&องการให&โปรแกรมทFางานบรรท#ดต;อไปเลย ถ>งแม&จะไม;สามารถเปnดไฟลYได&กตาม จะเข<ยนได&ด#งน<?
          H                                                                                         C

                   Private Sub OpenFile( )
                       Dim MyFileReader As System.IO.StreamReader
                       On Error Resume Next           'ถSาเกUด Runtime Error ใหSทางานบรรท7ดถ7ดไปเลย
                                                                                 W
                       MyFileReader = System.IO.File.OpenText(“c:abc.txt”)        'ส78งเป<ดไฟลA c:abc.txt
                       'คWาส78งต^อไป...
                   End Sub

         หรBอถ&าเปnดไฟลYไม;ได&กให&แสดงข&อความผ(ดพลาดข>นมาแล&วทFางานต;อไป เราจะสามารถเข<ยนได&ด#งน<?
                               C                      ?




                                                                 -5-
VB .NET 2005 By Warawut Khangkhan
การตรวจสอบและจ#ดการก#บข&อผ(ดพลาดใน VB.NET 2005 Express Edition


                    Private Sub OpenFile( )
                        Dim MyFileReader As System.IO.StreamReader
                        On Error Resume Next           'ถSาเกUด Runtime Error ใหSทางานบรรท7ดถ7ดไปเลย
                                                                                  W
                        MyFileReader = System.IO.File.OpenText(“c:abc.txt”)        'ส78งเป<ดไฟลA c:abc.txt
                        If Err.Number <> 0 Then        'ตรวจสอบว^ามQ Error หรDอไม^ โดยดiจาก Err.Number
                            MessageBox.Show(Err.Description)
                        End If
                        'คWาส78งต^อไป...
                    End Sub

โครงสรางการจดการขอผดพลาดดวย Try...Catch...Finally
         ในห#วข&อท<แล&วเราได&ทFาความรI&จ#กก#บคFาส#Hง On Error เพBHอใช&จ#ดการก#บข&อผ(ดพลาดท<Hเก(ดข>?นมาแล&ว คFาส#Hง On Error ถBอ
                     H
เปG น Unstructured Error Handling หรB อคF าส# H งจ# ด การก# บข& อผ( ด พาดแบบไม; เปG น โครงสร& า ง เพราะเมB H อ เก( ดข& อผ( ด พลาดแล& ว
โปรแกรมจะกระโดดไปทFางาน ณ ชBอเลเบลหรBอหมายเลขบรรท#ดท<เH รากFาหนดไว& ซ>Hงไม;ใช;แนวทางในการเข<ยนโปรแกรมท<Hด<
                                       H
         ด# งน# ? น VB .NET จ> งม<ค F าส# H งจ# ด การข& อผ( ด พลาดแบบใหม; น# H นคB อ โครงสร& า งคF าส# H ง Try...Catch...Finally ซ>H งถB อ เปG น
Structured Exception Handling หรBอรIปแบบการจ#ดการข&อผ(ดพลาดท<HเปGนโครงสร&าง ล#กษณะเด<ยวก#นก#บภาษาโปรแกรมแบบ
OOP อBHน ๆ เช;น C++, C#, Delphi และ Java โครงสร&างคFาส#Hง Try...Catch...Finally น<?ถBอเปGนโครงสร&างมาตรฐานท<Hใช&จ#ดการข&อ
ผ(ดพลาดใน .NET กล;าวคBอ ท9กภาษาท<Hสน#บสน9น .NET Framework กCจะใช&โครงสร&างน<?ในการจ#ดการก#บข&อผ(ดพลาดเช;นเด<ยวก#น

Exception
          ก;อนท<HจะพIดถ>งการใช&งานโครงสร&าง Try...Catch...Finally เราควรทFาความรI&จ#กก#บ Exception ก#นก;อน เนBHองจาก VB
.NET จะใช& Exception เปGนกลไกในการตรวจสอบข&อผ(ดพลาด (คล&ายก#บ Object Err แต; Exception จะใช&ก#บ Try...Catch...Finally
เท;าน#?น)
          Exception คBอ Object ชน(ดพ(เศษท<HอยI;ในคลาส (Class) System.Exception ซ>HงจะถIกสร&างข>?นมาโดยอ#ตโนม#ต(เมBHอ VB .NET
ตรวจพบข&อผ( ด พลาดใด ๆ กC ต าม Exception จะเกC บข& อมI ลเก< Hย วก#บข&อผ( ด พลาดท< Hเก(ดข> ? น เช;น ข&อ ความแสดงข& อผ( ด พลาด
(Properties Message), แหล;งท<Hมาของปaญหา (Properties Source) และลFาด#บการเก(ดข&อผ(ดพลาด (Stack Trace) เปGนต&น
          นอกจากน#?น Exception ไม;ได&ใช&เฉพาะในโปรแกรมท<Hเราเข<ยนด&วย VB .NET เท;าน#?น (ขณะท<H Object Err จะใช&ได&เฉพาะใน
โปรแกรมท<Hเข<ยนด&วย VB เท;าน#?น) เพราะด&วยแนวค(ดของ .NET ทFาให&โปรแกรมท<Hเราเข<ยนด&วยภาษาอBHนและนFามาใช&ใน VB .NET
ได& เรากCสามารถตรวจสอบข&อผ(ดพลาด โดยใช& Exception ได&เช;นเด<ยวก#น




                                                                     -6-
VB .NET 2005 By Warawut Khangkhan
การตรวจสอบและจ#ดการก#บข&อผ(ดพลาดใน VB.NET 2005 Express Edition


โครงสรางคFาส1ง Try...Catch...Finally
         Try...Catch...Finally ม<โครงสร&างคFาส#Hงด#งน<?

         รMปแบบ:
                   Try
                      'คFาส#Hงท<Hต&องการทFางาน
                      '...
                   Catch <ชDอออบเจjค> As <ชนUด Exception>
                              8
                      'คFาส#Hงท<ให&ทาเมBอเก(ด Error
                                H F H
                      '...
                   Finally
                      'คFาส#Hงท<จะทFาต;อไป (ไม;ว;าจะเก(ด Error หรBอไม;กตาม)
                                 H                                     C
                      '...
                   End Try

          คFาส#Hงภายใต& Try จะเปGนช9ดคFาส#Hงท<Hเราต&องการทFางาน เช;น เปnดไฟลY เปGนต&น ช9ดคFาส#Hงภายใต& Catch จะถIกเร<ยกใช&กCต;อ
เมBHอเก(ดข&อผ(ดพลาดในส;วนของ Try (ถ&าไม;ผ(ดพลาดจะไม;ถIกเร<ยกใช&) สFาร#บช9ดคFาส#Hงภายใต& Finally จะถIกเร<ยกใช&ท9กคร#?ง ไม;ว;า
จะพบข&อผ(ดพลาดหรBอไม;กCตาม (ถ&าเราไม;ต&องการให&ทFางานอะไรต;อกCไม;จFาเปGนต&องม< Finally ด#งน#?นโครงสร&างกCจะเหลBอเพ<ยง
Try...Catch...End Try เท;าน#?น)
          ต#วอย;างโพรซ<เยอรY OpenFile ในต#วอย;างท<แล&ว เราสามารถเข<ยนโปรแกรมเพBHอจ#ดการก#บข&อผ(ดพลาดโดยใช&โครงสร&าง
                                                      H
Try...Catch...Finaally แทนคFาส#Hง On Error ได&ด#งน<?

                   Dim MyFileReader As System.IO.StreamReader
                   Try
                       MyFileReader = System.IO.File.OpenText(“c:abc.txt”)
                   Catch er As Exception
                       MessageBox.Show(er.Message())
                   Finally
                       MessageBox.Show(“คWาส78งภายใตS Finally จะถiกทWาทmกคร7nงไม^ว^าจะ Error หรDอไม^”)
                   End Try




                                                              -7-
VB .NET 2005 By Warawut Khangkhan
การตรวจสอบและจ#ดการก#บข&อผ(ดพลาดใน VB.NET 2005 Express Edition


       เราสามารถกFาหนด Object หลาย ๆ ต#วมาร#บ Exception เฉพาะเจาะจงท<Hเก(ดข>?นได& เช;น ถ&าเปnดไฟลYไม;ได&จะให&ข>?น Error
บอกช#ดเจนว;าหาไฟลYไม;พบพร&อมท#?งบอกต&นตอด&วยว;า Error มาจากไหน หรBอถ&าไม;พบไดเรคทอร<Hท<Hระบ9กCให&บอกให&ช#ดเจนว;าไม;
พบไดเรคทอร<พร&อมท#?งบอกต&นตอด&วยว;า Error มาจากไหนเช;นก#น หรBอถ&าเปGนเหต9การณYนอกเหนBอจากน#?นให&ข>?น Error ท#Hวไป
แทน เราสามารถด#ดแปลงโพรซ<เยอรY OpenFile ของเราได&ด#งน<?

                   Dim MyFileReader As System.IO.StreamReader
                   Try
                       MyFileReader = System.IO.File.OpenText(“c:abc.txt”)
                   Catch er1 As FileNotFoundException
                       MessageBox.Show(er1.Message( ) & vbCrLf & er1.StackTrace)
                   Catch er2 As DirectoryNotFoundException
                       MessageBox.Show(er2.Message( ) & vbCrLf & er2.StackTrace)
                   Catch er3 As Exception
                       MessageBox.Show(er3.Message( ) & vbCrLf & er3.StackTrace)
                   Finally
                       MessageBox.Show(“คWาส78งภายใตS Finally จะถiกทWาทmกคร7nงไม^ว^าจะ Error หรDอไม^”)
                   End Try

          จากต# ว อย; า งข& า งต& นถ& า เปn ด ไฟลY ไม; ได& Object er1 จะถI ก สร& า งข> ? น มาเพB H อ เกC บข& อมI ล เก< H ย วก# บข& อผ( ด พลาด
FileNotFoundException แต;ถ&าเก(ดความผ(ดพลาดเนBHองจากหาไดเรคทอร<ไม;พบ Object er2 จะถIกสร&างข>?นมาเพBHอเกCบข&อมIลเก<Hยว
ก#บข&อผ(ดพลาด DirectoryNotFoundException แต;ถ&าเปGน Exception อBHน ๆ นอกเหนBอจากน<? Object er3 จะถIกสร&างข>?นมาเพBHอเกCบ
ข&อมIลเก<Hยวก#บข&อผ(ดพลาดน#น   ?




                                                                   -8-

More Related Content

Similar to การตรวจสอบและจัดการกับข้อผิดพลาดใน VB..NET 2005 Express Editor

บทที่ 1 บทนำ
บทที่ 1 บทนำบทที่ 1 บทนำ
บทที่ 1 บทนำKittichai Pinlert
 
PHP Tutorial (introduction)
PHP Tutorial (introduction)PHP Tutorial (introduction)
PHP Tutorial (introduction)Tinnakorn Puttha
 
ความรู้เบื้องต้นภาษาจาวา
ความรู้เบื้องต้นภาษาจาวาความรู้เบื้องต้นภาษาจาวา
ความรู้เบื้องต้นภาษาจาวาThanachart Numnonda
 
อยากเขียนโปรแกรมสักตัว เล่ม 1
อยากเขียนโปรแกรมสักตัว เล่ม 1อยากเขียนโปรแกรมสักตัว เล่ม 1
อยากเขียนโปรแกรมสักตัว เล่ม 1Thinnakrit Knoo-Aksorn
 
Algorithm Flowchart
Algorithm FlowchartAlgorithm Flowchart
Algorithm FlowchartWarawut
 
Java Programming [10/12]: Java Applet
Java Programming [10/12]: Java AppletJava Programming [10/12]: Java Applet
Java Programming [10/12]: Java AppletIMC Institute
 
Programming
ProgrammingProgramming
Programmingsa
 
2. โครงสร้างภาษาซี
2. โครงสร้างภาษาซี2. โครงสร้างภาษาซี
2. โครงสร้างภาษาซีmansuang1978
 
การพัฒนาโปรแกรม วิชญา
การพัฒนาโปรแกรม วิชญาการพัฒนาโปรแกรม วิชญา
การพัฒนาโปรแกรม วิชญาwinewic199
 
รายงาน PHP - Know2pro.com
รายงาน PHP - Know2pro.comรายงาน PHP - Know2pro.com
รายงาน PHP - Know2pro.comKnow Mastikate
 
โครงสร้างภาษาซี
โครงสร้างภาษาซีโครงสร้างภาษาซี
โครงสร้างภาษาซีPatipat04
 
อัลกอริทึมและการวิเคราะห์ปัญหา
อัลกอริทึมและการวิเคราะห์ปัญหาอัลกอริทึมและการวิเคราะห์ปัญหา
อัลกอริทึมและการวิเคราะห์ปัญหาskiats
 

Similar to การตรวจสอบและจัดการกับข้อผิดพลาดใน VB..NET 2005 Express Editor (20)

20110303 joomla-appserv-server2go
20110303 joomla-appserv-server2go20110303 joomla-appserv-server2go
20110303 joomla-appserv-server2go
 
บทที่ 1 บทนำ
บทที่ 1 บทนำบทที่ 1 บทนำ
บทที่ 1 บทนำ
 
PHP Tutorial (introduction)
PHP Tutorial (introduction)PHP Tutorial (introduction)
PHP Tutorial (introduction)
 
ความรู้เบื้องต้นภาษาจาวา
ความรู้เบื้องต้นภาษาจาวาความรู้เบื้องต้นภาษาจาวา
ความรู้เบื้องต้นภาษาจาวา
 
อยากเขียนโปรแกรมสักตัว เล่ม 1
อยากเขียนโปรแกรมสักตัว เล่ม 1อยากเขียนโปรแกรมสักตัว เล่ม 1
อยากเขียนโปรแกรมสักตัว เล่ม 1
 
Algorithm Flowchart
Algorithm FlowchartAlgorithm Flowchart
Algorithm Flowchart
 
Chapter 05 Loop
Chapter 05 LoopChapter 05 Loop
Chapter 05 Loop
 
Chapter 05 Loop
Chapter 05 LoopChapter 05 Loop
Chapter 05 Loop
 
Java AWT
Java AWTJava AWT
Java AWT
 
หลักการเขียนโปรแกรม
หลักการเขียนโปรแกรมหลักการเขียนโปรแกรม
หลักการเขียนโปรแกรม
 
Java Programming [10/12]: Java Applet
Java Programming [10/12]: Java AppletJava Programming [10/12]: Java Applet
Java Programming [10/12]: Java Applet
 
Php week 2
Php week 2Php week 2
Php week 2
 
Programming
ProgrammingProgramming
Programming
 
Computer
ComputerComputer
Computer
 
Lesson2
Lesson2Lesson2
Lesson2
 
2. โครงสร้างภาษาซี
2. โครงสร้างภาษาซี2. โครงสร้างภาษาซี
2. โครงสร้างภาษาซี
 
การพัฒนาโปรแกรม วิชญา
การพัฒนาโปรแกรม วิชญาการพัฒนาโปรแกรม วิชญา
การพัฒนาโปรแกรม วิชญา
 
รายงาน PHP - Know2pro.com
รายงาน PHP - Know2pro.comรายงาน PHP - Know2pro.com
รายงาน PHP - Know2pro.com
 
โครงสร้างภาษาซี
โครงสร้างภาษาซีโครงสร้างภาษาซี
โครงสร้างภาษาซี
 
อัลกอริทึมและการวิเคราะห์ปัญหา
อัลกอริทึมและการวิเคราะห์ปัญหาอัลกอริทึมและการวิเคราะห์ปัญหา
อัลกอริทึมและการวิเคราะห์ปัญหา
 

More from Warawut

Business Computer Project 4
Business Computer Project 4Business Computer Project 4
Business Computer Project 4Warawut
 
Object-Oriented Programming 10
Object-Oriented Programming 10Object-Oriented Programming 10
Object-Oriented Programming 10Warawut
 
Object-Oriented Programming 9
Object-Oriented Programming 9Object-Oriented Programming 9
Object-Oriented Programming 9Warawut
 
Object-Oriented Programming 8
Object-Oriented Programming 8Object-Oriented Programming 8
Object-Oriented Programming 8Warawut
 
Object-Oriented Programming 7
Object-Oriented Programming 7Object-Oriented Programming 7
Object-Oriented Programming 7Warawut
 
Object-Oriented Programming 6
Object-Oriented Programming 6Object-Oriented Programming 6
Object-Oriented Programming 6Warawut
 
Management Information System 6
Management Information System 6Management Information System 6
Management Information System 6Warawut
 
Management Information System 5
Management Information System 5Management Information System 5
Management Information System 5Warawut
 
Management Information System 4
Management Information System 4Management Information System 4
Management Information System 4Warawut
 
Object-Oriented Programming 5
Object-Oriented Programming 5Object-Oriented Programming 5
Object-Oriented Programming 5Warawut
 
Business Computer Project 3
Business Computer Project 3Business Computer Project 3
Business Computer Project 3Warawut
 
Management Information System 3
Management Information System 3Management Information System 3
Management Information System 3Warawut
 
Business Computer Project 2
Business Computer Project 2Business Computer Project 2
Business Computer Project 2Warawut
 
Chapter 2 Strategy & Information System
Chapter 2 Strategy & Information SystemChapter 2 Strategy & Information System
Chapter 2 Strategy & Information SystemWarawut
 
Object-Oriented Programming 4
Object-Oriented Programming 4Object-Oriented Programming 4
Object-Oriented Programming 4Warawut
 
Business Computer Project 1
Business Computer Project 1Business Computer Project 1
Business Computer Project 1Warawut
 
Chapter 1 Organization & MIS
Chapter 1 Organization & MISChapter 1 Organization & MIS
Chapter 1 Organization & MISWarawut
 
Object-Oriented Programming 3
Object-Oriented Programming 3Object-Oriented Programming 3
Object-Oriented Programming 3Warawut
 
Object-Oriented Programming 2
Object-Oriented Programming 2Object-Oriented Programming 2
Object-Oriented Programming 2Warawut
 
Object-Oriented Programming 1
Object-Oriented Programming 1Object-Oriented Programming 1
Object-Oriented Programming 1Warawut
 

More from Warawut (20)

Business Computer Project 4
Business Computer Project 4Business Computer Project 4
Business Computer Project 4
 
Object-Oriented Programming 10
Object-Oriented Programming 10Object-Oriented Programming 10
Object-Oriented Programming 10
 
Object-Oriented Programming 9
Object-Oriented Programming 9Object-Oriented Programming 9
Object-Oriented Programming 9
 
Object-Oriented Programming 8
Object-Oriented Programming 8Object-Oriented Programming 8
Object-Oriented Programming 8
 
Object-Oriented Programming 7
Object-Oriented Programming 7Object-Oriented Programming 7
Object-Oriented Programming 7
 
Object-Oriented Programming 6
Object-Oriented Programming 6Object-Oriented Programming 6
Object-Oriented Programming 6
 
Management Information System 6
Management Information System 6Management Information System 6
Management Information System 6
 
Management Information System 5
Management Information System 5Management Information System 5
Management Information System 5
 
Management Information System 4
Management Information System 4Management Information System 4
Management Information System 4
 
Object-Oriented Programming 5
Object-Oriented Programming 5Object-Oriented Programming 5
Object-Oriented Programming 5
 
Business Computer Project 3
Business Computer Project 3Business Computer Project 3
Business Computer Project 3
 
Management Information System 3
Management Information System 3Management Information System 3
Management Information System 3
 
Business Computer Project 2
Business Computer Project 2Business Computer Project 2
Business Computer Project 2
 
Chapter 2 Strategy & Information System
Chapter 2 Strategy & Information SystemChapter 2 Strategy & Information System
Chapter 2 Strategy & Information System
 
Object-Oriented Programming 4
Object-Oriented Programming 4Object-Oriented Programming 4
Object-Oriented Programming 4
 
Business Computer Project 1
Business Computer Project 1Business Computer Project 1
Business Computer Project 1
 
Chapter 1 Organization & MIS
Chapter 1 Organization & MISChapter 1 Organization & MIS
Chapter 1 Organization & MIS
 
Object-Oriented Programming 3
Object-Oriented Programming 3Object-Oriented Programming 3
Object-Oriented Programming 3
 
Object-Oriented Programming 2
Object-Oriented Programming 2Object-Oriented Programming 2
Object-Oriented Programming 2
 
Object-Oriented Programming 1
Object-Oriented Programming 1Object-Oriented Programming 1
Object-Oriented Programming 1
 

การตรวจสอบและจัดการกับข้อผิดพลาดใน VB..NET 2005 Express Editor

  • 1. VB .NET 2005 By Warawut Khangkhan การตรวจสอบและจ#ดการก#บข&อผ(ดพลาดใน VB.NET 2005 Express Edition การตรวจสอบและจดการกบขอผดพลาดใน VB .NET 2005 Express Edition ในการพ#ฒนาโปรแกรมท9กโปรแกรมย;อ มม<ข&อผ(ด พลาดเก(ดข> ?น ท# ?งระหว;า งการพ# ฒนาโปรแกรมหรB อ หล# งพ#ฒ นา โปรแกรมเสรCจส(?นไปแล&ว ย;อมม<ข&อผ(ดพลาดเก(ดข>?นได& เพราะฉะน#?นเราจFาเปGนท<Hจะต&องรI&ถ>งข&อผ(ดพลาดต;าง ๆ รวมไปถ>งการ จ#ดการก#บข&อผ(ดพลาดท<เH ก(ดข>น ? ชนดของขอผดพลาดต-าง ๆ ท01อาจเกดข34น ข&อผ(ดพลาดในโปรแกรม (ไม;ว;าจะเข<ยนด&วยภาษาใด) สามารถแบ;งออกเปGน 3 ประเภทหล#ก ๆ ได&แก; Syntax Error, Logic Error และ Runtime Error Syntax Error เปGนความผ(ดพลาดท<เH ก(ดข>นจากการเข<ยนคFาส#Hงไม;ถIกต&องตามรIปแบบไวยากรณY (Syntax) ของโปรแกรม เช;น ? Private Sub Test1( ) Dim CustomerName As String CustomerNme = “Warawut” End Sub จากต#วอย;างข&างต&น จะเก(ดความผ(ดพลาดท<เH ราประกาศต#วแปร CustomerName ไว& แต;เวลาเราใช&งานจร(ง ๆ กล#บพ(มพY ชBอของต#วแปรเปGน CustomerNme ซ>Hงไม;ม<ตวอ#กษร a ใน Name H # อ<กต#วอย;าง เช;น Private Sub Test2( ) Dim Long As Integer Long = 1000 End Sub เก(ดข&อผ(ดพลาดท<Hเราต#?งชBHอต#วแปรเปGน Long เนBHองจากต#วแปร Long ท<Hเราได&ต#?งชBHอไว&เปGนคFาส#Hงสงวน (Keyword) ท<Hม< อยI;ในโปรแกรม VB .NET ซ>Hง VB .NET ไม;อน9ญาตให&ต?งชBHอต#วแปรซ?าก#บ Keyword ได& # F Syntax Error ถB อว; า เปG น ประเภทข& อผ( ด พลาดท< H ส ามารถตรวจสอบได&ง ; า ยท< Hส 9 ด ในบรรดาข& อผ( ด พลาดท# ? ง หมด เนBHองจาก VB .NET IDE จะเตBอนให&ทราบอยI;เสมอในขณะท<Hเราพ(มพYโค&ด (Code) โปรแกรม รวมท#?งบอกต&นตอของปaญหาให&ด&วย เสรCจสรรพ เพ<งเราเลBHอนเมาสYไปย#งจ9ดท<H IDE ข<ดเส&นใต&ไว&กCจะม<คFาอธ(บายถ>งต&นตอของปaญหา ซ>HงเมBHอแก&ไขโปรแกรมให&เร<ยบ ร&อยตามคFาแนะนFาของ IDE กCจะสามารถคอมไพลYโปรแกรมได&ตามปกต( หรBอในช;วงท<เH ราส#HงคอมไพลYโปรแกรม ถ&าหากโปรแกรม< Syntax Error กCจะม<การแจ&งข&อผ(ดพลาดและหมายเลขบรรท#ดท<Hเก(ดข>นผ(ดพลาดให&ทราบ ? -1-
  • 2. VB .NET 2005 By Warawut Khangkhan การตรวจสอบและจ#ดการก#บข&อผ(ดพลาดใน VB.NET 2005 Express Edition Logic Error (ลอจกของโปรแกรมผดพลาด) Logic Error หรBอเร<ยกอ<กอย;างหน>Hงว;า Semantic Error เก(ดจากการท<HโปรแกรมทFางานได&ไม;ตรงตามท<Hเราต&องการ เช;น ถ& า เราเข< ย น Procedure การถอนเง( น จากบ# ญช< (Withdrawal) เพB H อ หาค; า ของ NewAmount อ# น เก( ด จากการห# ก ลบเง( นต& น (OriginalAmount) ด&วยเง(นท<Hตองการถอน (WithdrawAmount) ด#งน<? & Private Function Withdrawal(ByVal OriginalAmount As Double _ ByVal WithdrawAmount As Double) As Double Dim NewAmount As Double NewAmount = OriginalAmount + WithdrawAmount Return (NewAmount) End Sub จากต#วอย;างจะเหCนว;าไม;ม<ความผ(ดพลาดใด ๆ ในแง;กฎเกณฑYของภาษา แต;เมBHอร#นโปรแกรมจะพบว;าได&ผลล#พธYไม;ตรง ก#บท<Hต&องการ เพราะแทนท<Hจะเข<ยนว;า NewAmount = OriginalAmount – WithdrawAmount เรากล#บเข<ยนผ(ดเปGน NewAmoun = OriginalAmount + WithdrawAmount ทFาให&ผลล#พธYทออกมาผ(ดไปจากท<ควรเปGน <H H Logic Erro ถBอเปGนความผ(ดพลาดท<Hตรวจพบได&ยากท<Hส9ด เนBHองจากไม;ม<เครBHองมBอใดตรวจสอบให&เราได&ก;อนเหมBอน ก#บกรณ< Syntax Error เราจะพบข&อผ(ดพลาดประเภทน<?กCต;อเมBHอตรวจสอบผลล#พธYแล&วพบว;าไม;ตรงก#บส(Hงท<Hต&องการ ซ>Hงต&อง อาศ#ยความละเอ<ยดรอบคอบในการตรวจสอบอย;างมาก Runtime Error (ความผดพลาดขณะรนโปรแกรม) Runtime Error หรBอเร<ยกอ<กอย;างหน>Hงว;า Execution Error เปGนข&อผ(ดพลาดท<Hเก(ดข>?นขณะร#นโปรแกรม ซ>Hงจะตรวจสอบ ไม;พบในขณะท<เH ข<ยนโปรแกรมเช;นเด<ยวก#บ Logic Error ต#วอย;างของ Runtime Error เช;น เราส#HงเปnดไฟลY แต;โปรแกรมไม;พบไฟลYท<H ต&องการ, การหารต#วเลขใด ๆ ด&วยศIนยY, การอ&างถ>งอ(นเดCกซYของอารYเรยYเก(นกว;าจFานวนสมาช(กท<HอารYเรยYน#?นม<อยI; เปGนต&น ข&อ ผ(ดพลาดเหล;าน<?ถ&าเราไม;ได&เข<ยนโปรแกรมปpองก#นไว&ก;อน เมBHอเก(ดข>?นแล&วอาจทFาให&โปรแกรมถ>งข#?นหย9ดทFางาน (Terminate) กลางค#นได&ทนท< เช;น # Private Sub OpenFile( ) Dim MyFileReader As System.IO.StreamReader MyFileReader = System.IO.File.OpenText(“C:abc.txt”) 'ส78งเป<ดไฟลA c:abc.txt End Sub ต#วอย;า งโปรแกรมข&างต&นเราเข<ย น Procedure OpenFile เพBHอเปnดเทCกซYไฟลYและอ;านข&อมIลจากไฟลYข> ?นมา ซ> Hงถ&า ไฟลY c:abc.txt ท<Hเราต&องการเปnดน#?นไม;ม<อยI;จร(ง หรBอม<อยI;แต;ไฟลYเส<ย กCจะทFาให&เก(ด Runtime Error และอาจทFาให&โปรแกรมของเรา หย9ดทFางานท#นท< -2-
  • 3. VB .NET 2005 By Warawut Khangkhan การตรวจสอบและจ#ดการก#บข&อผ(ดพลาดใน VB.NET 2005 Express Edition การจดการขอผดพลาดโดยใชคFาส1ง On Error... ใน VB เวอรYช#Hนก;อนม<คFาส#Hงท<Hใช&จ#ดการก#บ Runtime Error (ความผ(ดพลาดขณะร#นโปรแกรม เช;น เปnดไฟลYหรBอฐาน ข&อมIลไม;ได&, เก(ดการหารด&วยศIนยY) เพBHอช;วยให&โปรแกรมท<Hเราเข<ยนข>?นมาม<ความน;าเชBHอถBอสIง ไม;หย9ดทFางาน โดยการใช&คFาส#Hง On Error ซ>Hงหมายถ>ง ถ&าเก(ด Runtime Error ข>?นจะให&ทFาคFาส#Hงอะไรต;อไป คFาส#Hง On Error ย#งสามารถใช&งานภายใน VB .NET ได& เช;นก#น แต;ถBอว;าเปGน Unstructured Error Handling คBอ การจ#ดการความผ(ดพลาดแบบไม;เปGนโครงสร&าง คFาส#Hง On Error ม<ว(ธ<การใช&งานอยI; 3 รIปแบบหล#ก ๆ ได&แก; ● On Error Goto <ชDอเลเบลหรDอหมายเลขบรรท7ด> 8 ● On Error Goto 0 ● On Error Resume Next On Error Goto <ชJ1อเลเบลหรJอหมายเลขบรรทด> คFาส#H ง On Error Goto จะใช& เพBH อ บอกก# บ VB ว;า เมB Hอ เก(ดข&อผ( ด พลาดให& ก ระโดดไปทFา งานท< Hต Fา แหน; ง เลเบลใด หรBอ บรรท#ดท<Hเท;าไหร;ในโปรแกรมย;อย โดยม<ว(ธ<การใช&งาน ด#งน<? รMปแบบ: [ Sub | Function ] <ชDอโพรซQเยอรA> ( ) 8 On Error Goto <ชDอเลเบลหรDอหมายเลขบรรท7ด> 8 'คFาส#Hง ... Exit Sub <ชอเลเบล>: 'คFาส#Hงจ#ดการก#บข&อผ(ดพลาดท<Hพบ End [ Sub | Function ] เช;นจากต#วอย;างโพรซ<เยอรY OpenFile ท<Hใช&เปnดเทCกซYไฟลY เราสามารใช& On Error Goto เพBHอช;วยปpองก#นไม;ให&โปรแกรม หย9ดทFางานกลางค#นเมBอไม;สามารถเปnดไฟลYได& ด#งน<? H Private Sub OpenFile( ) Dim MyFileReader As System.IO.StreamReader On Error Goto HandleError 'ถSาเกUด Runtime Error ใหSไปทWางานทQ8 HandleError MyFileReader = System.IO.File.OpenText(“C:abc.txt”) 'ส78งเป<ดไฟลA c:abc.txt Exit Sub HandleError: MessageBox.Show(Err.Description) End Sub หมายเหตP: Err เปGน object พ(เศษ ซ>HงจะถIกสร&างข>นมาโดยอ#ตโนม#ต(เมBHอเก(ดข&อผ(ดพลาด ? -3-
  • 4. VB .NET 2005 By Warawut Khangkhan การตรวจสอบและจ#ดการก#บข&อผ(ดพลาดใน VB.NET 2005 Express Edition Object Err ต#วอย;างท<Hผ;านมาเราใช& Object Err เพBHอแสดงข&อความอธ(บายข&อผ(ดพลาดท<Hเก(ดข>?น Err เปGน Object ชน(ดพ(เศษท<HจะถIก สร&างข>นมาดยอ#ตโนม#ตเ( มBHอเก(ดข&อผ(ดพลาดในโปรแกรม โดย Err จะเกCบหมายเลขและข&อความแสดงข&อผ(ดพลาดไว&ใน Properties ? Number และ Description ตามลFาด#บ ในต#วอย;างข&างต&นเราใช& MessageBox.Show(Err.Description) เพBHอแสดงค;า Properties Description ของ Object Err ออก มาบนหน&าจอ Err.Description จะเกCบข&อความอธ(บายข&อผ(ดพลาดเปGนภาษาอ#งกฤษ แต;เราสามารถแสดงข&อความตามท<Hต&องการ (เช;นข&อความเปGนภาษาไทย) ได& ด&วยการตรวจสอบหมายเลขข& อผ(ด พลาดจาก Err.Number แล&วแสดงข&อ ความอธ(บ ายข&อ ผ(ดพลาดเอง เช;น Private Sub OpenFile( ) Dim MyFileReader As System.IO.StreamReader On Error Goto HandleError 'ถSาเกUด runtime error ใหSไปทWางานทQ8 HandleError MyFileReader = System.IO.File.OpenText(“c:abc.txt”) 'ส78งเป<ดไฟลA c:abc.txt Exit Sub HandleError: If Err.Number = 53 Then Message.Show(“ไม^พบไฟลA “ & “c:abc.txt” & “ ทQ8ตองการ”) S End If End Sub หรBอเราอาจใช& MessageBox.Show(Err.Number) เพBHอแสดงหมายเลขของข&อผ(ดพลาดกCได&เช;นเด<ยวก#น หมายเหตP: ถ&า Err.Number ม<ค;าเท;าก#บ 0 หมายความว;าไม;เก(ดข&อผ(ดพลาดใด ๆ Object Err ย#งม<เมธอด (Method) Clear ท<Hใช&เคล<ยรYข&อผ(ดพลาดท<Hเก(ดข>?น และเมธอด (Method) Raise ท<Hใช&สFาหร#บสร&าง ข&อผ(ดพลาดข>?นมา (เพBHอใช&ทดสอบว;าสามารถจ#ดการก#บข&อผ(ดพลาดได&อย;างถIกต&องหรBอไม; ) โดยเราสามารถใช&เมธอด Err.Raise เพBHอให& VB สร&างข&อผ(ดพลาดตามหมายเลขท<เH รากFาหนดได& รIปแบบ คBอ รMปแบบ: Err.Raise(<หมายเลขขSอผUดพลาดทQ8ตSองการสรSาง>) เช;น เราอาจใช&ค Fาส#Hง Err.Raise(53) เพBHอทดสอบว;าถ&า เปnด ไฟลYท< Hต&องการไม;ได& โปรแกรมเราย#งสามารถจ#ด การก#บ ข&อผ(ดพลาดน#?นได&หรBอไม; -4-
  • 5. VB .NET 2005 By Warawut Khangkhan การตรวจสอบและจ#ดการก#บข&อผ(ดพลาดใน VB.NET 2005 Express Edition On Error Goto 0 คFาส# Hง On Error Goto 0 ใช& เพBH อ ให& ย กเล(ก การตรวจสอบ Runtime Error ท<Hต# ?ง ไว& หรBออ<กน# ยหน> H งกCค B อ ให& VB เปGนผI & จ# ด การก# บข& อผ( ด พลาดเอง เช; นต# ว อย; า ง Procedure OpenFile ในตอนแรกถ& า พบ Runtime Error จะให& ไ ปทF า งานท< H เ ลเบล HandleError แต;หล#งจากท<HทFาคFาส#Hง OpenText ไปเร<ยบร&อยแล&ว เราอาจต&องการให& VB ยกเล(กการตรวจสอบและให& VB จ#ดการ ก#บข&อผ(ดพลาดเอง กCสามารถเข<ยนโปรแกรมได&ด#งน<? Private Sub OpenFile( ) Dim MyFileReader As System.IO.StreamReader On Error Goto HandleError 'ถSาเกUด Runtime Error ใหSไปทWางานทQ8 HandleError MyFileReader = System.IO.File.OpenText(“c:abc.txt ”) 'ส78งเป<ดไฟลA c:abc.txt On Error Goto 0 'ยกเลUกการไปทWาทQ8 HandleError เมDอเกUด Runtime Error โดยปล^อยใหS VB จ7ดการ 8 'คWาส78งต^อไป... Exit Sub HandleError: MessageBox.Show(Err.Description) End Sub On Error Resume Next คFาส# Hง On Error Resume Next ใช&กF า หนดให&โ ปรแกรมทFาคF าส#H งต;อ ไปถ> ง แม&ว ;า จะเก(ดข&อผ( ด พลาดข> ?นกC ต าม เช; น จาก ต#วอย;างท<แล&ว ถ&าเราต&องการให&โปรแกรมทFางานบรรท#ดต;อไปเลย ถ>งแม&จะไม;สามารถเปnดไฟลYได&กตาม จะเข<ยนได&ด#งน<? H C Private Sub OpenFile( ) Dim MyFileReader As System.IO.StreamReader On Error Resume Next 'ถSาเกUด Runtime Error ใหSทางานบรรท7ดถ7ดไปเลย W MyFileReader = System.IO.File.OpenText(“c:abc.txt”) 'ส78งเป<ดไฟลA c:abc.txt 'คWาส78งต^อไป... End Sub หรBอถ&าเปnดไฟลYไม;ได&กให&แสดงข&อความผ(ดพลาดข>นมาแล&วทFางานต;อไป เราจะสามารถเข<ยนได&ด#งน<? C ? -5-
  • 6. VB .NET 2005 By Warawut Khangkhan การตรวจสอบและจ#ดการก#บข&อผ(ดพลาดใน VB.NET 2005 Express Edition Private Sub OpenFile( ) Dim MyFileReader As System.IO.StreamReader On Error Resume Next 'ถSาเกUด Runtime Error ใหSทางานบรรท7ดถ7ดไปเลย W MyFileReader = System.IO.File.OpenText(“c:abc.txt”) 'ส78งเป<ดไฟลA c:abc.txt If Err.Number <> 0 Then 'ตรวจสอบว^ามQ Error หรDอไม^ โดยดiจาก Err.Number MessageBox.Show(Err.Description) End If 'คWาส78งต^อไป... End Sub โครงสรางการจดการขอผดพลาดดวย Try...Catch...Finally ในห#วข&อท<แล&วเราได&ทFาความรI&จ#กก#บคFาส#Hง On Error เพBHอใช&จ#ดการก#บข&อผ(ดพลาดท<Hเก(ดข>?นมาแล&ว คFาส#Hง On Error ถBอ H เปG น Unstructured Error Handling หรB อคF าส# H งจ# ด การก# บข& อผ( ด พาดแบบไม; เปG น โครงสร& า ง เพราะเมB H อ เก( ดข& อผ( ด พลาดแล& ว โปรแกรมจะกระโดดไปทFางาน ณ ชBอเลเบลหรBอหมายเลขบรรท#ดท<เH รากFาหนดไว& ซ>Hงไม;ใช;แนวทางในการเข<ยนโปรแกรมท<Hด< H ด# งน# ? น VB .NET จ> งม<ค F าส# H งจ# ด การข& อผ( ด พลาดแบบใหม; น# H นคB อ โครงสร& า งคF าส# H ง Try...Catch...Finally ซ>H งถB อ เปG น Structured Exception Handling หรBอรIปแบบการจ#ดการข&อผ(ดพลาดท<HเปGนโครงสร&าง ล#กษณะเด<ยวก#นก#บภาษาโปรแกรมแบบ OOP อBHน ๆ เช;น C++, C#, Delphi และ Java โครงสร&างคFาส#Hง Try...Catch...Finally น<?ถBอเปGนโครงสร&างมาตรฐานท<Hใช&จ#ดการข&อ ผ(ดพลาดใน .NET กล;าวคBอ ท9กภาษาท<Hสน#บสน9น .NET Framework กCจะใช&โครงสร&างน<?ในการจ#ดการก#บข&อผ(ดพลาดเช;นเด<ยวก#น Exception ก;อนท<HจะพIดถ>งการใช&งานโครงสร&าง Try...Catch...Finally เราควรทFาความรI&จ#กก#บ Exception ก#นก;อน เนBHองจาก VB .NET จะใช& Exception เปGนกลไกในการตรวจสอบข&อผ(ดพลาด (คล&ายก#บ Object Err แต; Exception จะใช&ก#บ Try...Catch...Finally เท;าน#?น) Exception คBอ Object ชน(ดพ(เศษท<HอยI;ในคลาส (Class) System.Exception ซ>HงจะถIกสร&างข>?นมาโดยอ#ตโนม#ต(เมBHอ VB .NET ตรวจพบข&อผ( ด พลาดใด ๆ กC ต าม Exception จะเกC บข& อมI ลเก< Hย วก#บข&อผ( ด พลาดท< Hเก(ดข> ? น เช;น ข&อ ความแสดงข& อผ( ด พลาด (Properties Message), แหล;งท<Hมาของปaญหา (Properties Source) และลFาด#บการเก(ดข&อผ(ดพลาด (Stack Trace) เปGนต&น นอกจากน#?น Exception ไม;ได&ใช&เฉพาะในโปรแกรมท<Hเราเข<ยนด&วย VB .NET เท;าน#?น (ขณะท<H Object Err จะใช&ได&เฉพาะใน โปรแกรมท<Hเข<ยนด&วย VB เท;าน#?น) เพราะด&วยแนวค(ดของ .NET ทFาให&โปรแกรมท<Hเราเข<ยนด&วยภาษาอBHนและนFามาใช&ใน VB .NET ได& เรากCสามารถตรวจสอบข&อผ(ดพลาด โดยใช& Exception ได&เช;นเด<ยวก#น -6-
  • 7. VB .NET 2005 By Warawut Khangkhan การตรวจสอบและจ#ดการก#บข&อผ(ดพลาดใน VB.NET 2005 Express Edition โครงสรางคFาส1ง Try...Catch...Finally Try...Catch...Finally ม<โครงสร&างคFาส#Hงด#งน<? รMปแบบ: Try 'คFาส#Hงท<Hต&องการทFางาน '... Catch <ชDอออบเจjค> As <ชนUด Exception> 8 'คFาส#Hงท<ให&ทาเมBอเก(ด Error H F H '... Finally 'คFาส#Hงท<จะทFาต;อไป (ไม;ว;าจะเก(ด Error หรBอไม;กตาม) H C '... End Try คFาส#Hงภายใต& Try จะเปGนช9ดคFาส#Hงท<Hเราต&องการทFางาน เช;น เปnดไฟลY เปGนต&น ช9ดคFาส#Hงภายใต& Catch จะถIกเร<ยกใช&กCต;อ เมBHอเก(ดข&อผ(ดพลาดในส;วนของ Try (ถ&าไม;ผ(ดพลาดจะไม;ถIกเร<ยกใช&) สFาร#บช9ดคFาส#Hงภายใต& Finally จะถIกเร<ยกใช&ท9กคร#?ง ไม;ว;า จะพบข&อผ(ดพลาดหรBอไม;กCตาม (ถ&าเราไม;ต&องการให&ทFางานอะไรต;อกCไม;จFาเปGนต&องม< Finally ด#งน#?นโครงสร&างกCจะเหลBอเพ<ยง Try...Catch...End Try เท;าน#?น) ต#วอย;างโพรซ<เยอรY OpenFile ในต#วอย;างท<แล&ว เราสามารถเข<ยนโปรแกรมเพBHอจ#ดการก#บข&อผ(ดพลาดโดยใช&โครงสร&าง H Try...Catch...Finaally แทนคFาส#Hง On Error ได&ด#งน<? Dim MyFileReader As System.IO.StreamReader Try MyFileReader = System.IO.File.OpenText(“c:abc.txt”) Catch er As Exception MessageBox.Show(er.Message()) Finally MessageBox.Show(“คWาส78งภายใตS Finally จะถiกทWาทmกคร7nงไม^ว^าจะ Error หรDอไม^”) End Try -7-
  • 8. VB .NET 2005 By Warawut Khangkhan การตรวจสอบและจ#ดการก#บข&อผ(ดพลาดใน VB.NET 2005 Express Edition เราสามารถกFาหนด Object หลาย ๆ ต#วมาร#บ Exception เฉพาะเจาะจงท<Hเก(ดข>?นได& เช;น ถ&าเปnดไฟลYไม;ได&จะให&ข>?น Error บอกช#ดเจนว;าหาไฟลYไม;พบพร&อมท#?งบอกต&นตอด&วยว;า Error มาจากไหน หรBอถ&าไม;พบไดเรคทอร<Hท<Hระบ9กCให&บอกให&ช#ดเจนว;าไม; พบไดเรคทอร<พร&อมท#?งบอกต&นตอด&วยว;า Error มาจากไหนเช;นก#น หรBอถ&าเปGนเหต9การณYนอกเหนBอจากน#?นให&ข>?น Error ท#Hวไป แทน เราสามารถด#ดแปลงโพรซ<เยอรY OpenFile ของเราได&ด#งน<? Dim MyFileReader As System.IO.StreamReader Try MyFileReader = System.IO.File.OpenText(“c:abc.txt”) Catch er1 As FileNotFoundException MessageBox.Show(er1.Message( ) & vbCrLf & er1.StackTrace) Catch er2 As DirectoryNotFoundException MessageBox.Show(er2.Message( ) & vbCrLf & er2.StackTrace) Catch er3 As Exception MessageBox.Show(er3.Message( ) & vbCrLf & er3.StackTrace) Finally MessageBox.Show(“คWาส78งภายใตS Finally จะถiกทWาทmกคร7nงไม^ว^าจะ Error หรDอไม^”) End Try จากต# ว อย; า งข& า งต& นถ& า เปn ด ไฟลY ไม; ได& Object er1 จะถI ก สร& า งข> ? น มาเพB H อ เกC บข& อมI ล เก< H ย วก# บข& อผ( ด พลาด FileNotFoundException แต;ถ&าเก(ดความผ(ดพลาดเนBHองจากหาไดเรคทอร<ไม;พบ Object er2 จะถIกสร&างข>?นมาเพBHอเกCบข&อมIลเก<Hยว ก#บข&อผ(ดพลาด DirectoryNotFoundException แต;ถ&าเปGน Exception อBHน ๆ นอกเหนBอจากน<? Object er3 จะถIกสร&างข>?นมาเพBHอเกCบ ข&อมIลเก<Hยวก#บข&อผ(ดพลาดน#น ? -8-